#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Point {
    int x, y;
    int idx;  // 原始索引（1-based）
};

// 比较函数：按x坐标排序
bool compareX(const Point& a, const Point& b) {
    return a.x < b.x;
}

// 比较函数：按y坐标排序
bool compareY(const Point& a, const Point& b) {
    return a.y < b.y;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    
    while (t--) {
        int n;
        cin >> n;
        
        vector<Point> points(n);
        for (int i = 0; i < n; ++i) {
            cin >> points[i].x >> points[i].y;
            points[i].idx = i + 1;  // 1-based索引
        }
        
        // 复制点集用于排序
        vector<Point> sortedX = points;
        vector<Point> sortedY = points;
        
        // 按x坐标排序
        sort(sortedX.begin(), sortedX.end(), compareX);
        // 按y坐标排序
        sort(sortedY.begin(), sortedY.end(), compareY);
        
        // 计算x方向的贡献
        long long sumX = 0;
        for (int i = 0; i < n / 2; ++i) {
            sumX += sortedX[n - 1 - i].x - sortedX[i].x;
        }
        
        // 计算y方向的贡献
        long long sumY = 0;
        for (int i = 0; i < n / 2; ++i) {
            sumY += sortedY[n - 1 - i].y - sortedY[i].y;
        }
        
        // 选择贡献更大的维度进行配对
        if (sumX >= sumY) {
            for (int i = 0; i < n / 2; ++i) {
                cout << sortedX[i].idx << " " << sortedX[n - 1 - i].idx << "\n";
            }
        } else {
            for (int i = 0; i < n / 2; ++i) {
                cout << sortedY[i].idx << " " << sortedY[n - 1 - i].idx << "\n";
            }
        }
    }
    
    return 0;
}